using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace FiltronASP.Models.DAO.Interfaces
{
    /// <summary>
    /// Interfejs dla operacji bazodanowych specyficznych dla tabeli <code>pages</code>.
    /// </summary>
    public interface IPageDAO : IGenericDAO<Page, System.Nullable<int>>
    {
        /// <summary>
        /// Pobieranie listy obiektów na podstawie typu strony.
        /// </summary>
        /// <param name="pageTypeId">typ strony</param>
        /// <returns>Lista rekordów o zadanym typie strony</returns>
        IQueryable<Page> FindByPageType(int pageTypeId);

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym języku</returns>
        IQueryable<Page> FindByLanguage(int languageId);

        /// <summary>
        /// Pobieranie obiektu na podstawie języka, alliasu strony i linku do strony.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="pageAllias">allias</param>
        /// <param name="pageLink">Link</param>
        /// <returns>Rekord o zadanym języku, alliasie strony i linku do strony.</returns>
        Page FindByLanguageAndAlliasAndLink(int languageId, string pageAllias, string pageLink);

        /// <summary>
        /// Pobieranie obiektu na podstawie języka, alliasu strony, linku do strony i id roznego od zadanego.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="pageAllias">allias</param>
        /// <param name="pageLink">Link</param>
        /// <returns>Rekord o zadanym języku, alliasie strony i linku do strony.</returns>
        Page FindByLanguageAlliasLinkAndNotId(int languageId, string pageAllias, string pageLink, int pageIdToExclude);


        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka, nazwy typu strony i informacji o publikacji.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="pageTypeName">nazwa typu strony</param>
        /// <param name="pagePublished">opublikowana</param>
        /// <returns>lista rekordow o zadanym języku, nazwie typu strony i informacji o publikacji.</returns>
        IQueryable<Page> FindByLanguageAndTypeNameAndPublished(int languageId, string pageTypeName, bool pagePublished);

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka, nazwy szablonu i informacji o publikacji.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="templateName">nazwa szablonu</param>
        /// <param name="pagePublished">opublikowana</param>
        /// <returns>lista rekordow o zadanym języku, nazwie szablonu i informacji o publikacji.</returns>
        IQueryable<Page> FindByLanguageAndTemplateNameAndPublished(int languageId, string templateName, bool pagePublished);

   
        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka, nazwy szablonu i informacji o publikacji.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="templateId">id szablonu</param>
        /// <param name="pagePublished">opublikowana</param>
        /// <returns>lista rekordow o zadanym języku, id szablonu i informacji o publikacji.</returns>
        IQueryable<Page> FindByLanguageAndTemplateIdAndPublished(int languageId, int templateId, bool pagePublished);

        /// <summary>
        /// Pobieranie listy obiektów na podstawie skrótu języka, nazwy typu strony i informacji o publikacji.
        /// </summary>
        /// <param name="languageAbbr">skrót języka</param>
        /// <param name="pageTypeName">nazwa typu strony</param>
        /// <param name="pagePublished">opublikowana</param>
        /// <returns>lista rekordow o zadanym skrócie języka, nazwie typu strony i informacji o publikacji.</returns>
        IQueryable<Page> FindByLanguageAbbrAndTypeNameAndPublished(string languageAbbr, string pageTypeName, bool pagePublished);

        /// <summary>
        /// Pobieranie listy obiektów na podstawie skrótu języka, nazwy szablonu i informacji o publikacji.
        /// </summary>
        /// <param name="languageAbbr">skrót języka</param>
        /// <param name="templateName">nazwy szablonu</param>
        /// <param name="pagePublished">opublikowana</param>
        /// <returns>lista rekordow o zadanym skrócie języka, nazwie szablonu i informacji o publikacji.</returns>
        IQueryable<Page> FindByLanguageAbbrAndTemplateNameAndPublished(string languageAbbr, string templateName, bool pagePublished);

        /// <summary>
        /// Wstawianie listy obiektów na podstawie jezyka.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        bool InsertForNewLanguage(int defaultLanguageId, int newLanguageId);

        /// <summary>
        /// Pobieranie najwyższego porządku o zadanym typie strony.
        /// </summary>
        /// <param name="pageTypeId">typ strony</param>
        /// <param name="languageId">wersja jezykowa</param>
        /// <returns>Najwyższy porządek dla danego typu strony</returns>
        int? SelectMaxPageOrdering(int pageTypeId, int languageId);

        /// <summary>
        /// Pobieranie najwyższego id dla stron.
        /// </summary>
        /// <returns>najwyższe id dla stron</returns>
        int? SelectMaxPageId();

        /// <summary>
        /// Metoda do aktualizacji porzadku stron.
        /// </summary>
        /// <param name="oldOrdering">poprzedni porzadek</param>
        /// <param name="newOrdering">nowy porzadek</param>
        /// <param name="pageTypeId">typ strony</param>
        /// <param name="languageId">wersja jezykowa</param>
        /// <param name="pageId">przesuwana strona</param>
        /// <returns></returns>
        bool ReorderPages(int oldOrdering, int newOrdering, int pageTypeId, int languageId, int pageId);

        /// <summary>
        /// Usuwanie obiektow po jezyku.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        bool DeleteByLanguage(int languageId);

        IQueryable<Page> findNewsByPageAndLanguageIdAndMonth(int languageId, string MonthName, string year, bool pagePublished);

        /// <summary>
        /// Aktualizacja linkow.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        bool UpdateLinksForNewLanguage(int newLanguageId);


    }
}
